﻿#pragma once
#include <string>
#include <iostream>
#include <sstream>
#include <stdio.h>
using namespace std;

/**********************字符串类**********************
* a、支持不同长度的字符串
* b、构造方法：(1)默认构造；(2)整数，浮点数构造；(3)一般构造； (4)复制构造；
* c、运算符重载：(1)加法 + ；(2)减法 - ；(3)输出流运算符 << 
* d、其他方法：(1)获取成员；(2)修改成员；(3)动态内存分配
******************************************************/
class MyString
{
public:
  
    // 无参数构造函数
    MyString();

    // 一般构造函数
    MyString(const char* str);

    // 复制构造函数
    MyString(const MyString& myStr);


    // 类型转换构造函数_整数，浮点数构造；
    MyString(const int n);
    MyString(const float f, const unsigned int decimalLen=1);

    MyString(stringbuf & buffer);

    //析构函数
    ~MyString();

    int getLength() const;
    int getSize() const;
    bool isEmpty();
   
    int find(const MyString& pattern);//使用kmp算法求解子串
    
    int toInt();
    float toFloat();
    MyString subString(const int begin, const int len);

      
    MyString& operator=(const MyString& mystr);
    MyString operator+(const MyString& add);
    MyString& operator+=(const MyString& add);
    void operator+=(const float f);
    void operator+=(const int n);
    void operator+=(const char* p);
    MyString& operator-=(const MyString& minus);
    MyString& operator-(const MyString& minus);
    void operator-=(const float f);
    void operator-=(const int n);
    void operator-=(const char* p);

    
    friend ostream& operator<<(ostream& os, const MyString& mystr);


private:
    void getNext(int* next, const MyString& pattern);
    // 数据成员
    char* pstr;     //字符串指针
    int length;     //字符串长度
    int size;       //字符串动态分配内存大小
};

class convert_error : public runtime_error {
    const char* _type;
public:
    convert_error(const char* _RawStr, const char* _Type) : runtime_error(_RawStr), _type(_Type) {}
    friend ostream& operator<<(ostream& os, const convert_error& ce) {
        os << '"' << ce.what() << '"' << "can't be convert to " << ce._type << endl;
        return os;
    }
    ~convert_error() {}
};
